import axios from 'axios';
import { message } from 'antd';

// 创建 axios 实例
const request = axios.create({
  baseURL: process.env.REACT_APP_API_BASE_URL || '',
  timeout: 5000,
  headers: {
    'Content-Type': 'application/json;charset=utf-8'
  }
});

// 请求拦截器
request.interceptors.request.use(
  (config) => {
    if (!config.headers) {
      config.headers = {};
    }

    const token = localStorage.getItem('token');
    if (token) {
      config.headers.token = token;
    }

    const userId = localStorage.getItem('userId');
    if (userId) {
      config.headers.Id = userId;
    }

    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// 响应拦截器
request.interceptors.response.use(
  (response) => {
    if (response.data && response.data.code === 3) {
      // 清除本地存储
      localStorage.removeItem('token');
      localStorage.removeItem('userId');
      localStorage.removeItem('userInfo');

      // 使用antd的message提示
      message.error(response.data.msg || '登录已失效，请重新登录');

      // 跳转到登录页
      setTimeout(() => {
        if (window.location.pathname !== 'user/login') {
          window.location.href = 'user/login';
        }
      }, 1000);

      return Promise.reject(new Error('登录已失效，请重新登录'));
    }
    
    return response.data;
  },
  (error) => {
    console.log('请求错误:', error);

    if (error.response) {
      const { status, data } = error.response;

      // token过期处理（HTTP状态码方式）
      if (status === 401 || status === 403) {
        // 清除本地存储
        localStorage.removeItem('token');
        localStorage.removeItem('userId');
        localStorage.removeItem('userInfo');

        const errorMessage = data?.message || '登录已失效，请重新登录';
        message.error(errorMessage);

        // 跳转到登录页
        setTimeout(() => {
          if (window.location.pathname !== 'user/login') {
            window.location.href = 'user/login';
          }
        }, 1000);

        return Promise.reject(new Error('登录已失效'));
      }

      // 其他HTTP错误
      console.error(`请求失败: ${status}`, data);

    } else if (error.request) {
      console.error('网络错误: 无法连接到服务器');
      message.error('网络连接失败，请检查网络设置');
    } else {
      console.error('请求配置错误:', error.message);
    }

    return Promise.reject(error);
  }
);

export default request;